package com.wn.common.util;

import com.wn.common.pojo.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JWTUtil {
    private static Logger log = LoggerFactory.getLogger(JWTUtil.class);
    /**
     * 生成 公钥 和 私钥存放到文件
     *
     * @param publicFilename
     * @param privateFilename
     * @param secret
     */
    public static void generateKey(String publicFilename, String privateFilename, String secret) {
        try {
            RsaUtil.generateKey(publicFilename, privateFilename, secret);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 上面的方法只用执行一次,利用顶级密钥[12345]生成公钥和私钥
     */
//  public static void main(String[] args) {
//       generateKey(Const.PUBLIC_KEY,Const.PRIVATE_KEY,"123456");
//   }

    /**
     * 生成token令牌
     *
     * @param users      传的账户
     * @param privateKey 文件中读取的私钥
     * @param time       设置token令牌消亡时间
     * @return
     */
    public static String generateToken(User users, String privateKey, Integer time) throws Exception {
        String token = Jwts.builder().claim("id", users.getUserId())
                //生成需要存用户的 id 和 用户名 角色  邮箱  在令牌中
                .claim("account", users.getUserAccount())
                .claim("password", users.getUserPassword())
                .claim("roleSign", users.getRoleSign())
                .claim("email", users.getUserEmail())
                .setExpiration(DateTime.now().plusMinutes(time).toDate())
                .signWith(SignatureAlgorithm.RS256, RsaUtil.getPrivateKey(privateKey)).compact();
        return token;
    }

    /**
     * 解析令牌
     *
     * @param token     传入的令牌
     * @param publicKey 公钥
     * @return
     */
    public static User parserToken(String token, String publicKey) throws Exception {
        log.info("token：{}",token);
        Claims body = Jwts.parser().setSigningKey(RsaUtil.getPublicKey(publicKey)).parseClaimsJws(token).getBody();
        //解析需要从令牌中获取用户的 id 和 用户名
        Integer id = body.get("id", Integer.class);
        String account = body.get("account", String.class);
        String roleSign = body.get("roleSign",String.class);
        String email = body.get("email",String.class);

        User users = new User(id, account,roleSign,email);
        return users;

    }

}
